home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1993 November / JCSM Shareware Collection - 1993-11.iso / cl720 / qbnws31j.lzh / INTCODE.ASM < prev    next >
Assembly Source File  |  1991-11-07  |  3KB  |  121 lines

  1. PAGE 56,132
  2. TITLE IntCode.ASM
  3. SUBTTL QBASIC Interpreter DOS/BIOS interrupt call bin file
  4. ;
  5. ; IntCode.ASM - (C) 1991 by Brent Ashley
  6. ; Allows interrupt calls from within QBASIC Interpreter.
  7. ; Parameter: pointer to var of TYPE RegTypeX same as in QB4.5
  8. ; If DS or ES in structure is set to -1, they are initialized to
  9. ;   DGROUP (BASIC's DS)
  10. ; Calls interrupt 21h unless caller modifies bin file on the fly
  11. ;   with user-defined INTERRUPT subprogram, as distributed
  12. ;   by author.
  13. ;
  14. ; Written with Microsoft QC/QuickAssembler v2.51 
  15. ;   
  16. ; Assembled as follows:
  17. ;   QCL IntCode.ASM
  18. ;   EXE2BIN IntCode
  19. ;   DEL IntCode.EXE
  20. ;   DEL IntCode.OBJ
  21. ;
  22.  
  23. ; Equates for Rgs parameter
  24. AX_ = +0
  25. BX_ = +2
  26. CX_ = +4
  27. DX_ = +6
  28. BP_ = +8
  29. SI_ = +10
  30. DI_ = +12
  31. FL_ = +14
  32. DS_ = +16
  33. ES_ = +18
  34.  
  35. .MODEL medium, BASIC
  36. .CODE
  37.  
  38. Int21 PROC  USES si di ds, Rgs:PTR WORD
  39.  
  40. LOCAL TempBP:WORD, BasicDS:WORD, TempBX:WORD, TempDS:WORD
  41.  
  42.   push bp           ; save bp for later
  43.  
  44.   mov bx,Rgs        ; use bx as index ptr to Rgs registers var
  45.  
  46.   mov ax,[bx].DS_   ; check ds for -1
  47.   cmp ax,0FFFFh     ; 
  48.   jne dschecked     ; if not, skip default setting
  49.   push ds
  50.   pop [bx].DS_      ; set to default ds
  51. dschecked:  
  52.   mov ax,[bx].ES_   ; check es for -1
  53.   cmp ax,0FFFFh     ; 
  54.   jne eschecked     ; if not, skip default setting
  55.   push ds
  56.   pop [bx].ES_      ; default es to ds
  57. eschecked:  
  58.  
  59.   mov ax,[bx].BP_   ; load TempBP thru ax while bp in use for stack frame
  60.   mov TempBP,ax
  61.  
  62.   mov ax,[bx].AX_   ; load ax 
  63.                     ; bx loaded later due to indexing
  64.   mov cx,[bx].CX_   ; load cx
  65.   mov dx,[bx].DX_   ; load dx
  66.   mov si,[bx].SI_   ; load si
  67.   mov di,[bx].DI_   ; load di
  68.  
  69.   push [bx].ES_     ; use push/pop for seg regs
  70.   pop es            ; load es
  71.  
  72.   push [bx].BX_     ; hold this for now
  73.   push ds           ; save data seg now - it was needed for Rgs var
  74.   pop BasicDS       ;
  75.   push [bx].DS_     ;
  76.   pop ds            ;
  77.  
  78.   mov bp,TempBP     ; load bp 
  79.   pop bx            ; load bx
  80.   
  81.   int 21h           ; do it
  82.  
  83.   push bp           ; save returned bp
  84.   mov bp,sp         ; restore our stack frame
  85.   mov bp,[bp+2]     ; from stack (saved at start of routine)
  86.  
  87.   mov TempBX,bx     ; save bx to stack var
  88.   mov bx,Rgs        ; restore Rgs ptr
  89.  
  90.   push ds           ; save ds to stack var
  91.   pop TempDS        ;
  92.   push BasicDS      ;
  93.   pop ds            ; restore BASIC ds
  94.  
  95.   mov [bx].AX_,ax   ; load Rgs from registers
  96.   mov ax,TempBX     ; load Rgs.bx from stack var thru ax
  97.   mov [bx].BX_,ax   ;
  98.   mov [bx].CX_,cx   ; cx
  99.   mov [bx].DX_,dx   ; dx
  100.   pop ax            ; bp thru ax
  101.   mov [bx].BP_,ax   ;
  102.   mov [bx].SI_,si   ; si
  103.   mov [bx].DI_,di   ; di
  104.  
  105.   pushf             ; save flags to Rgs
  106.   pop [bx].FL_      ;
  107.  
  108.   push es           ; es
  109.   pop [bx].ES_      ;
  110.  
  111.   mov ax,TempDS     ; load ds from int return
  112.   mov [bx].DS_,ax   ;
  113.  
  114.   pop dx            ; pop saved bp and discard
  115.  
  116.   ret               ; return to caller
  117.  
  118. Int21   ENDP
  119.  
  120. END
  121.